package com.xcf.cloud.usersvc.controller;

import com.xcf.cloud.userapi.UserConstant;
import com.xcf.cloud.userapi.dto.AccountDto;
import com.xcf.cloud.userapi.dto.RegisterInfoDto;
import com.xcf.cloud.usersvc.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;

/**
 * @author xiaocf
 */
@RestController
@RequestMapping(UserConstant.SERVICE_CONTEXT_PATH)
public class UserController {

    @Autowired
    private IUserService userService;

    /**
     * 注册
     * 1）⽤户访问到登录⻚⾯，在登录⻚⾯中有注册新账号功能
     * 2）点击“注册新账号“，跳转到注册⻚⾯
     * 3）在注册⻚⾯，需要⽤户输⼊邮箱地址、密码、确认密码，然后点击”获取验证码“，系统会⽣成验证码
     * 并向所输⼊的邮箱地址发送该验证码，⽤户拿到邮箱中的验证码输⼊后完成注册
     * 规则如下
     * A：⼀分钟内只允许获取⼀次验证码（前端Js控制即可），验证码为随机⽣成的6位数字，10分钟内有
     * 效，验证码存储到mysql数据库中（因为⼤家未系统学习Redis，所以此处令牌存⼊数据库即可）； B：存储到mysql数据库之后，使⽤发邮件功能，将该验证码发送到所输⼊的邮箱地址中
     * C：⽤户从邮箱中拿到验证码，点击注册时，需要进⾏校验，因为验证码已经存⼊数据库，此时只需要
     * 查询数据库中该邮箱地址对应的最近⼀次的验证码记录，校验验证码是否正确，是否超时，若有问题，
     * 准确提示给⽤户
     * 4）注册成功后，根据 <⽤户邮箱+密码> ⽣成签发token令牌（此处⽣成⼀个UUID模拟即可），该
     * token令牌存⼊数据库（因为⼤家未系统学习Redis，所以此处令牌存⼊数据库即可），并写⼊cookie
     * 中（以后的每次请求都会在cookie中携带该token，⽹关过滤器通过验证token的合法性来确定⽤户请求
     * 是否合法，如果token合法，根据token取出⽤户信息---->邮箱），最后重定向到欢迎⻚⾯（显示邮箱地
     * 址）
     * 注册接⼝
     * true成功，false失败
     */
    @PostMapping(UserConstant.Path.REGISTER)
    public boolean register(HttpServletResponse response, @RequestBody RegisterInfoDto registerInfo) {
        String token = userService.register(registerInfo);
        if (null == token) {
            return false;
        }
        setCookie(response, token);
        return true;
    }

    /**
     * 登录
     * 1）⽤户访问登录⻚⾯，在登录⻚⾯输⼊邮箱地址+密码
     * 2）点击登录，后台对⽤户名和密码进⾏验证，然后根据<⽤户邮箱+密码> ⽣成签发token令牌（此处⽣
     * 成⼀个UUID模拟即可），该token令牌存⼊数据库（因为⼤家未系统学习Redis，所以此处令牌存⼊数
     * 据库即可），并写⼊cookie中（以后的每次请求都会在cookie中携带该token，⽹关过滤器通过验证
     * token的合法性来确定⽤户请求是否合法，如果token合法，根据token取出⽤户信息---->邮箱），最后
     * 重定向到欢迎⻚⾯（显示邮箱地址）
     * 登录接⼝，验证⽤户名密码合法性，根据⽤户名和
     * 密码⽣成token，token存⼊数据库，并写⼊cookie
     * 中，登录成功返回邮箱地址，重定向到欢迎⻚
     *
     * @param account 账号信息
     * @return 邮箱地址
     */
    @PostMapping(UserConstant.Path.LOGIN)
    public String login(HttpServletResponse response, @RequestBody AccountDto account) {
        String token = userService.login(account);
        if (null == token) {
            return "";
        }
        setCookie(response, token);
        return account.getEmail();
    }

    /**
     * 是否已注册，根据邮箱判断,true代表已经注册过，
     * false代表尚未注册
     *
     * @param email 邮箱
     * @return true 已经注册 false 未注册
     */
    @GetMapping(UserConstant.Path.CHECK_REGISTER)
    public boolean checkRegister(@PathVariable("email") String email) {
        return userService.checkRegister(email);
    }


    /**
     * 根据token查询⽤户登录邮箱接⼝
     *
     * @param token token
     * @return 邮箱地址
     */
    @GetMapping(UserConstant.Path.GET_USER_INFO_BY_TOKEN)
    public String getUserInfo(@PathVariable("token") String token) {
        return userService.getUserInfo(token);
    }

    private void setCookie(HttpServletResponse response, String token) {
        Cookie cookie = new Cookie("lagou-work", token);
        response.addCookie(cookie);
    }

    @GetMapping("/test")
    public String test() {
        return "test";
    }
}
